/*
 * expression_tree-test.cc
 *
 * Program för att testa Expression_Tree-klasserna. Lägg till fler test vid behov!
 */
#include "Expression_Tree.h"
#include <iostream>
#include <stdexcept>
using namespace std;

int main()
{
   // Ska inte vara möjligt - Expression_Tree ska vara abstrakt:
   // Expression_Tree* t0{ new Expression_Tree };

   // auto temp = t1->evaluate();

   // cout << "\n\nnew Integer(2)\n";
   // Integer* t1 = new Integer(2);
   // try
   // {
   //    cerr << "t1->evaluate() = " << t1->evaluate() << '\n';
   // }
   // catch (const exception& e)
   // {
   //    cerr << "Exception catched: " << e.what() << '\n';
   //    return 1;
   // }
   // cout << "t1->get_postfix() = " << t1->get_postfix() << '\n';
   // cout << "t1->str() = " << t1->str() << "\n\n";

// du har inte implementerat klassen Variable, Integer och Assagin i Expression_Tree.cc, gör det först.
   Expression_Tree* t2{ new Assign(new Variable("x"), new Integer(2)) };
   try
   {
      cerr << "t2->evaluate() = " << t2->evaluate() << '\n';
   }
   catch (const exception& e)
   {
      cerr << "Exception catched:: " << e.what() << '\n';
      return 2;
   }

   cout << "t2->get_postfix() = " << t2->get_postfix() << '\n';
   cout << "t2->str() = " << t2->str() << "\n\n";


   // cout << "\n\nt3{new Times(t1, t2)}\n";
   // Expression_Tree* t3{new Times(t1, t2)};

   // cout << "t2->get_postfix() = " << t3->get_postfix() << '\n';
   // cout << "t2->str() = " << t3->str() << "\n";

   // try
   // {
   //    cerr << "t3->evaluate() = " << t3->evaluate() << '\n';
   // }
   // catch (const exception& e)
   // {
   //    cerr << "Exception catched:: " << e.what() << '\n';
   //    return 2;
   // }

   // cout << "\n\nt4{ t3->clone() }\n"; 
   // Expression_Tree* t4{ t3->clone() };

   // cout << "t4->get_postfix() = " << t4->get_postfix() << '\n';
   // cout << "t4->str() = " << t4->str() << "\n";

   // try
   // {
   //    cerr << "t4->evaluate() = " << t4->evaluate() << '\n';
   // }
   // catch (const exception& e)
   // {
   //    cerr << "Exception catched:: " << e.what() << '\n';
   //    return 2;
   // }

   // delete t1;
   delete t2;
   return 0;
}
